<?php
/**
 * 输入安全验证和过滤
 * Created by PhpStorm.
 * User: blue
 * Date: 2017/11/8
 * Time: 9:29
 */

namespace aop\safe;


class SafeInput
{
    /**
     * 数据字段过滤
     * @param 数据 数组格式
     * @param 字段 数组格式
     * @return 过滤后的数据
     */
    public static function allFileds($data,$filed){
        //先判断传入的参数是否合法
        if(empty($data)||!is_array($data)) return false;
        if(empty($filed)||!is_array($filed)) return false;
        foreach ($data as $k => $v) {
            if(!in_array($k,$filed)){
                unset($data[$k]);
            }
        }
        return $data;
    }

    /**
     * xss 过滤标签函数
     * 采用的是strip_tags方法,也可以采用htmlspecials方法直接过滤
     * @param  [type] $data [数据]
     * @param  [type] $func [安全处理的函数名称,默认是采用strip_tags]
     * @return [type]       [处理后的数据]
     */
    public static function xssTrip($data,$func='strip_tags'){
        if(empty($data)){
            return $data;
        }
        //需要对方法进行约束
        switch($func){
            case 'strip_tags':
                $func="strip_tags";
                break;
            case 'intval':
                $func="intval";
                break;
            case 'htmlspecials':
                $func="htmlspecials";
                break;
            default:
                return;
        }
        return is_array($data)?array_map([__CLASS__,'xssTrip'], $data):$func(trim($data));
    }

    /**
     * 富文本编辑器过滤(需要htmlpurifiers组件)
     * 采用白名单过滤方式
     * @param $data
     * @return mixed
     */
    public static function xssHtmlPurifier($data){
        require_once './HtmlPurifier/HTMLPurifier.auto.php';
        $_clean_xss_config = HTMLPurifier_Config::createDefault();
        $_clean_xss_config->set('Core.Encoding', 'UTF-8');
        // 设置保留的标签
        $_clean_xss_config->set('HTML.Allowed','div,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]');
        $_clean_xss_config->set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align');
        $_clean_xss_config->set('HTML.TargetBlank', TRUE);
        $_clean_xss_obj = new HTMLPurifier($_clean_xss_config);
        // 执行过滤
        return $_clean_xss_obj->purify($data);
    }
//    测试代码
    /**
     * [dataSafe 模型数据安全处理] 需要修改
     * @param  array   $saveData     [数据]
     * @param  array   $formToData   [表单字段转数据库]
     * @param  boolean $validateName [验证器名称]
     * @param  boolean $validateScene [验证器场景]
     * @param  string  $filter       [过滤方法'strip_tags,trim']
     * @return [type]                [处理后的数据]
     */
    public  function dataSafe($saveData=[],$formToData=[],$validateName=false,$validateScene=false,$filter='strip_tags,trim'){
        /*1.saveData参数空值判断*/
        $data=empty($saveData)?$this->request->post('','',$filter):$savedata;
        /*2.数据空值再次判断*/
        if(empty($data)) return $this->error('没有数据');
        /*3.表单字段to数据库字段转换*/
        if(is_array($formToData)&&!empty($formToData)){
            $data=$this->buildParam($data);
        }else{
            $data=$data;
        }
        /*4.数据进行验证器的处理*/
        if($validateName!=false){
            // 实例化验证器,并验证
            $validate=Loader::validate($validateName);
            // $validate=new $validateName;
            if(!$validate->scene($validateScene)->batch()->check($data)){
                $this->error(json_encode($validate->getError(),JSON_UNESCAPED_UNICODE));
            }
        }
        /*5.入库前的参数过滤*/
        $data=SafeInput::xssTrip($data);
        return $data;
    }

    /**
     * [buildParam 表单字段和数据库字段的转换]
     * @param  array  $array [键名为数据库字段,键值为表单字段]
     * @return [type]        [description]
     */
    public  function buildParam($array=[]){
        $data=Request::instance()->param();
        if(is_array($array)&&!empty($array)){
            foreach ($array as $key => $value) {
                $data[$key]=$data[$value];
                unset($data[$value]);
            }
        }
        return $data;
    }

}